Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/settings/src/jvmMain/kotlin/org/meshtastic/feature/settings/DesktopSettingsScreen.kt 2d20cd8a4708e2ef66e98d5259f3a97ec93f240a (2d20cd8a) Text, 16.58 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.settings

Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.items
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.verticalScroll
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberCoroutineScope
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787kotlinx.coroutines.delay
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.database.DatabaseConstants
Tff7b72import T7ee787org.meshtastic.core.navigation.DiscoveryRoute
Tff7b72import T7ee787org.meshtastic.core.navigation.Route
Tff7b72import T7ee787org.meshtastic.core.navigation.SettingsRoute
Tff7b72import T7ee787org.meshtastic.core.navigation.WifiProvisionRoute
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.acknowledgements
Tff7b72import T7ee787org.meshtastic.core.resources.app_settings
Tff7b72import T7ee787org.meshtastic.core.resources.app_version
Tff7b72import T7ee787org.meshtastic.core.resources.bottom_nav_settings
Tff7b72import T7ee787org.meshtastic.core.resources.device_db_cache_limit
Tff7b72import T7ee787org.meshtastic.core.resources.device_db_cache_limit_summary
Tff7b72import T7ee787org.meshtastic.core.resources.device_links
Tff7b72import T7ee787org.meshtastic.core.resources.discovery_local_mesh
Tff7b72import T7ee787org.meshtastic.core.resources.help_and_documentation
Tff7b72import T7ee787org.meshtastic.core.resources.info
Tff7b72import T7ee787org.meshtastic.core.resources.modules_already_unlocked
Tff7b72import T7ee787org.meshtastic.core.resources.modules_unlocked
Tff7b72import T7ee787org.meshtastic.core.resources.node_layout_section_title
Tff7b72import T7ee787org.meshtastic.core.resources.preferences_language
Tff7b72import T7ee787org.meshtastic.core.resources.remotely_administrating
Tff7b72import T7ee787org.meshtastic.core.resources.theme
Tff7b72import T7ee787org.meshtastic.core.resources.wifi_devices
Tff7b72import T7ee787org.meshtastic.core.ui.component.DropDownPreference
Tff7b72import T7ee787org.meshtastic.core.ui.component.ListItem
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.component.MeshtasticDialog
Tff7b72import T7ee787org.meshtastic.core.ui.icon.ChevronRight
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Device
Tff7b72import T7ee787org.meshtastic.core.ui.icon.FormatPaint
Tff7b72import T7ee787org.meshtastic.core.ui.icon.HelpOutline
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Info
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Language
Tff7b72import T7ee787org.meshtastic.core.ui.icon.List
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Memory
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.PermScanWifi
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Wifi
Tff7b72import T7ee787org.meshtastic.core.ui.util.rememberShowToastResource
Tff7b72import T7ee787org.meshtastic.feature.settings.component.ExpressiveSection
Tff7b72import T7ee787org.meshtastic.feature.settings.component.HomoglyphSetting
Tff7b72import T7ee787org.meshtastic.feature.settings.component.NotificationSection
Tff7b72import T7ee787org.meshtastic.feature.settings.component.ThemePickerDialog
Tff7b72import T7ee787org.meshtastic.feature.settings.navigation.ConfigRoute
Tff7b72import T7ee787org.meshtastic.feature.settings.navigation.ModuleRoute
Tff7b72import T7ee787org.meshtastic.feature.settings.radio.RadioConfigItemList
Tff7b72import T7ee787org.meshtastic.feature.settings.radio.RadioConfigViewModel
Tff7b72import T7ee787kotlin.time.Duration.Companion.seconds

T8b949e/**
* Desktop-specific top-level settings screen. Replaces the Android `SettingsScreen` which uses Android-specific APIs
* (Activity, permissions, etc.).
*
* Shows radio configuration entry points that are fully shared in commonMain, plus app-level settings (theme,
* homoglyph, DB cache limit) and an App Info section (About link, version easter egg).
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffDesktopSettingsScreenTb4b4b4(
Te6edf3radioConfigViewModelTb4b4b4: Te6edf3RadioConfigViewModelTb4b4b4,
Te6edf3settingsViewModelTb4b4b4: Te6edf3SettingsViewModelTb4b4b4,
Te6edf3onNavigateTb4b4b4: Tb4b4b4(Te6edf3RouteTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3radioConfigViewModelTb4b4b4.Te6edf3radioConfigStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3destNode Tff7b72by Te6edf3radioConfigViewModelTb4b4b4.Te6edf3destNodeTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3localConfig Tff7b72by Te6edf3settingsViewModelTb4b4b4.Te6edf3localConfigTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3homoglyphEnabled Tff7b72by Te6edf3radioConfigViewModelTb4b4b4.Te6edf3homoglyphEncodingEnabledFlowTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tff7b72falseTb4b4b4)
Tff7b72val Te6edf3hiddenFeaturesUnlocked Tff7b72by Te6edf3settingsViewModelTb4b4b4.Te6edf3hiddenFeaturesUnlockedTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3cacheLimit Tff7b72by Te6edf3settingsViewModelTb4b4b4.Te6edf3dbCacheLimitTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3isOtaCapable Tff7b72by Te6edf3settingsViewModelTb4b4b4.Te6edf3isOtaCapableTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)

Tff7b72var Te6edf3showThemePickerDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showLanguagePickerDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showThemePickerDialogTb4b4b4) Tb4b4b4{
Te6edf3ThemePickerDialogTb4b4b4(
Te6edf3onClickTheme Tff7b72= Tb4b4b4{ Te6edf3settingsViewModelTb4b4b4.Te6edf3setThemeTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showThemePickerDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3showLanguagePickerDialogTb4b4b4) Tb4b4b4{
Te6edf3LanguagePickerDialogTb4b4b4(
Te6edf3onSelectLanguage Tff7b72= Tb4b4b4{ Te6edf3tag Tff7b72-Tff7b72> Te6edf3settingsViewModelTb4b4b4.Te6edf3setLocaleTb4b4b4(Te6edf3tagTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showLanguagePickerDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3bottom_nav_settingsTb4b4b4)Tb4b4b4,
Te6edf3subtitle Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3isLocalTb4b4b4) Tb4b4b4{
Tff7b72null
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3remoteName Tff7b72= Te6edf3destNodeTff7b72?.Te6edf3userTff7b72?.Te6edf3long_name Tff7b72?: Ta5d6ff"Ta5d6ff"
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3remotely_administratingTb4b4b4, Te6edf3remoteNameTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3ourNode Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3showNodeChip Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3paddingValues Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3paddingValuesTb4b4b4)Tb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3RadioConfigItemListTb4b4b4(
Te6edf3state Tff7b72= Te6edf3stateTb4b4b4,
Te6edf3isManaged Tff7b72= Te6edf3localConfigTb4b4b4.Te6edf3securityTff7b72?.Te6edf3is_managed Tff7b72?: Tff7b72falseTb4b4b4,
Te6edf3isOtaCapable Tff7b72= Te6edf3isOtaCapableTb4b4b4,
Te6edf3onRouteClick Tff7b72= Tb4b4b4{ Te6edf3route Tff7b72-Tff7b72>
Tff7b72val Te6edf3navRoute Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3routeTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3ConfigRoute Tff7b72-Tff7b72> Te6edf3routeTb4b4b4.Te6edf3route
Tff7b72is Te6edf3ModuleRoute Tff7b72-Tff7b72> Te6edf3routeTb4b4b4.Te6edf3route
Tff7b72else Tff7b72-Tff7b72> Tff7b72null
Tb4b4b4}
Te6edf3navRouteTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3onNavigateTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3onNavigate Tff7b72= Te6edf3onNavigateTb4b4b4,
Te6edf3onImport Tff7b72= Tb4b4b4{
T8b949e// Profile import not yet supported on Desktop
Tb4b4b4}Tb4b4b4,
Te6edf3onExport Tff7b72= Tb4b4b4{
T8b949e// Profile export not yet supported on Desktop
Tb4b4b4}Tb4b4b4,
Tb4b4b4)

T8b949e// App-local settings are only relevant when configuring the local node
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3isLocalTb4b4b4) Tb4b4b4{
Te6edf3ExpressiveSectionTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3app_settingsTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3themeTb4b4b4)Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3FormatPaintTb4b4b4,
Te6edf3trailingIcon Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3showThemePickerDialog Tff7b72= Tff7b72true
Tb4b4b4}

Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3preferences_languageTb4b4b4)Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3LanguageTb4b4b4,
Te6edf3trailingIcon Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3showLanguagePickerDialog Tff7b72= Tff7b72true
Tb4b4b4}

Te6edf3HomoglyphSettingTb4b4b4(
Te6edf3homoglyphEncodingEnabled Tff7b72= Te6edf3homoglyphEnabledTb4b4b4,
Te6edf3onToggle Tff7b72= Tb4b4b4{ Te6edf3radioConfigViewModelTb4b4b4.Te6edf3toggleHomoglyphCharactersEncodingEnabledTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Tff7b72val Te6edf3cacheItems Tff7b72= Te6edf3remember Tb4b4b4{
Tb4b4b4(Te6edf3DatabaseConstantsTb4b4b4.Te6edf3MIN_CACHE_LIMITTb4b4b4.Tb4b4b4.Te6edf3DatabaseConstantsTb4b4b4.Te6edf3MAX_CACHE_LIMITTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Te6edf3to Tffa657itTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3DropDownPreferenceTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_db_cache_limitTb4b4b4)Tb4b4b4,
Te6edf3enabled Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3items Tff7b72= Te6edf3cacheItemsTb4b4b4,
Te6edf3selectedItem Tff7b72= Te6edf3cacheLimitTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onItemSelected Tff7b72= Tb4b4b4{ Te6edf3selected Tff7b72-Tff7b72> Te6edf3settingsViewModelTb4b4b4.Te6edf3setDbCacheLimitTb4b4b4(Te6edf3selectedTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3summary Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_db_cache_limit_summaryTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3ExpressiveSectionTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3node_layout_section_titleTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3node_layout_section_titleTb4b4b4)Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3ListTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3onNavigateTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3NodeListTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3ExpressiveSectionTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3discovery_local_meshTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3discovery_local_meshTb4b4b4)Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3PermScanWifiTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3onNavigateTb4b4b4(Te6edf3DiscoveryRouteTb4b4b4.Te6edf3DiscoveryGraphTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3ExpressiveSectionTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_linksTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_linksTb4b4b4)Tb4b4b4, Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3DeviceTb4b4b4) Tb4b4b4{
Te6edf3onNavigateTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3DeviceLinksTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3ExpressiveSectionTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3wifi_devicesTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3wifi_devicesTb4b4b4)Tb4b4b4, Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3WifiTb4b4b4) Tb4b4b4{
Te6edf3onNavigateTb4b4b4(Te6edf3WifiProvisionRouteTb4b4b4.Te6edf3WifiProvisionTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3NotificationSectionTb4b4b4(
Te6edf3messagesEnabled Tff7b72= Te6edf3settingsViewModelTb4b4b4.Te6edf3messagesEnabledTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3onToggleMessages Tff7b72= Tb4b4b4{ Te6edf3settingsViewModelTb4b4b4.Te6edf3setMessagesEnabledTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3nodeEventsEnabled Tff7b72= Te6edf3settingsViewModelTb4b4b4.Te6edf3nodeEventsEnabledTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3onToggleNodeEvents Tff7b72= Tb4b4b4{ Te6edf3settingsViewModelTb4b4b4.Te6edf3setNodeEventsEnabledTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3lowBatteryEnabled Tff7b72= Te6edf3settingsViewModelTb4b4b4.Te6edf3lowBatteryEnabledTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3valueTb4b4b4,
Te6edf3onToggleLowBattery Tff7b72= Tb4b4b4{ Te6edf3settingsViewModelTb4b4b4.Te6edf3setLowBatteryEnabledTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Te6edf3ExpressiveSectionTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3help_and_documentationTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3help_and_documentationTb4b4b4)Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3HelpOutlineTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3onNavigateTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3HelpDocsTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3DesktopAppInfoSectionTb4b4b4(
Te6edf3appVersionName Tff7b72= Te6edf3settingsViewModelTb4b4b4.Te6edf3appVersionNameTb4b4b4,
Te6edf3hiddenFeaturesUnlocked Tff7b72= Te6edf3hiddenFeaturesUnlockedTb4b4b4,
Te6edf3onUnlockHiddenFeatures Tff7b72= Tb4b4b4{ Te6edf3settingsViewModelTb4b4b4.Te6edf3unlockHiddenFeaturesTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onNavigateToAbout Tff7b72= Tb4b4b4{ Te6edf3onNavigateTb4b4b4(Te6edf3SettingsRouteTb4b4b4.Te6edf3AboutTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e/** Desktop App Info section: About link and version with hidden-features unlock easter egg. */
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDesktopAppInfoSectionTb4b4b4(
Te6edf3appVersionNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3hiddenFeaturesUnlockedTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onUnlockHiddenFeaturesTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNavigateToAboutTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ExpressiveSectionTb4b4b4(Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3infoTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3acknowledgementsTb4b4b4)Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3InfoTb4b4b4,
Te6edf3trailingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3ChevronRightTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3onNavigateToAboutTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3DesktopAppVersionButtonTb4b4b4(
Te6edf3hiddenFeaturesUnlocked Tff7b72= Te6edf3hiddenFeaturesUnlockedTb4b4b4,
Te6edf3appVersionName Tff7b72= Te6edf3appVersionNameTb4b4b4,
Te6edf3onUnlockHiddenFeatures Tff7b72= Te6edf3onUnlockHiddenFeaturesTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72const Tff7b72val Te6edf3UNLOCK_CLICK_COUNT Tff7b72= T79c0ff5
Tff7b72private Tff7b72const Tff7b72val Te6edf3UNLOCKED_CLICK_COUNT Tff7b72= T79c0ff3
Tff7b72private Tff7b72const Tff7b72val Te6edf3UNLOCK_TIMEOUT_SECONDS Tff7b72= T79c0ff1

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDesktopAppVersionButtonTb4b4b4(
Te6edf3hiddenFeaturesUnlockedTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3appVersionNameTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3onUnlockHiddenFeaturesTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3scope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3showToast Tff7b72= Te6edf3rememberShowToastResourceTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3clickCount Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}

Te6edf3LaunchedEffectTb4b4b4(Te6edf3clickCountTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3clickCount Tff7b72in T79c0ff1.Tb4b4b4.Tff7b72<Te6edf3UNLOCK_CLICK_COUNTTb4b4b4) Tb4b4b4{
Te6edf3delayTb4b4b4(Te6edf3UNLOCK_TIMEOUT_SECONDSTb4b4b4.Te6edf3secondsTb4b4b4)
Te6edf3clickCount Tff7b72= T79c0ff0
Tb4b4b4}
Tb4b4b4}

Te6edf3ListItemTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3app_versionTb4b4b4)Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3MemoryTb4b4b4,
Te6edf3supportingText Tff7b72= Te6edf3appVersionNameTb4b4b4,
Te6edf3trailingIcon Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3clickCount Tff7b72= Te6edf3clickCountTb4b4b4.Te6edf3incTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3coerceInTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3UNLOCK_CLICK_COUNTTb4b4b4)

Tff7b72when Tb4b4b4{
Te6edf3clickCount Tff7b72=Tff7b72= Te6edf3UNLOCKED_CLICK_COUNT Tff7b72&Tff7b72& Te6edf3hiddenFeaturesUnlocked Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3clickCount Tff7b72= T79c0ff0
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3modules_already_unlockedTb4b4b4) Tb4b4b4}
Tb4b4b4}

Te6edf3clickCount Tff7b72=Tff7b72= Te6edf3UNLOCK_CLICK_COUNT Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3clickCount Tff7b72= T79c0ff0
Te6edf3onUnlockHiddenFeaturesTb4b4b4(Tb4b4b4)
Te6edf3scopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3showToastTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3modules_unlockedTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Supported languages — tag must match the CMP `values-<qualifier>` directory names. Empty tag means system default.
* Display names are written in the native language for clarity.
*/
Tff7b72private Tff7b72val Te6edf3SUPPORTED_LANGUAGES Tff7b72=
Te6edf3listOfTb4b4b4(
Ta5d6ff"Ta5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffSystem defaultTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffarTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffالعربيةTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbeTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffБеларускаяTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbgTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffБългарскиTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcaTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffCatalàTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcsTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffČeštinaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdeTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffDeutschTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffelTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffΕλληνικάTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffenTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffEnglishTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffesTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffEspañolTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffetTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffEestiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffiTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffSuomiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffFrançaisTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffgaTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffGaeilgeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffglTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffGalegoTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffheTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffעבריתTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhrTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffHrvatskiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhtTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffKreyòl AyisyenTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffhuTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffMagyarTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffisTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffÍslenskaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffitTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffItalianoTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffjaTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ff日本語Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffkoTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ff한국어Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffltTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffLietuviųTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnlTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffNederlandsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnoTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffNorskTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffplTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffPolskiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffptTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffPortuguêsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpt-BRTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffPortuguês (Brasil)Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffroTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffRomânăTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffruTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffРусскийTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffskTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffSlovenčinaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffslTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffSlovenščinaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsqTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffShqipTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsrTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffСрпскиTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsvTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffSvenskaTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftrTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffTürkçeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffukTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ffУкраїнськаTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffzh-CNTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ff中文 (简体)Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffzh-TWTa5d6ff" Te6edf3to Ta5d6ff"Ta5d6ff中文 (繁體)Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffLanguagePickerDialogTb4b4b4(Te6edf3onSelectLanguageTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3MeshtasticDialogTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3preferences_languageTb4b4b4)Tb4b4b4,
Te6edf3onDismiss Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3LazyColumn Tb4b4b4{
Te6edf3itemsTb4b4b4(Te6edf3SUPPORTED_LANGUAGESTb4b4b4) Tb4b4b4{ Tb4b4b4(Te6edf3tagTb4b4b4, Te6edf3displayNameTb4b4b4) Tff7b72-Tff7b72>
Te6edf3ListItemTb4b4b4(Te6edf3text Tff7b72= Te6edf3displayNameTb4b4b4, Te6edf3trailingIcon Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3onSelectLanguageTb4b4b4(Te6edf3tagTb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.1s